Design pattern for embedding mruby into middleware
from RubyKaigi2018
http://rubykaigi.org/2018/presentations/matsumotory.html#jun02
15:50 - 16:30, day 3, Hagi #rubykaigiC
mruby インタプリタをミドルウェアに組込む
一部モジュールを mruby で書ける
mrb_state をスレッド単位で実行する
並列実行を考慮
mrb_state が重くてスレッドなのにプロセスを起動してるみたいに起動に時間がかかる
init
master プロセスで mrb_state を起動して実行 (init)
fork でワーカプロセス生成、master とは独立した mrb_state を生成
全て独立したスクリプト
master と worker で mrb_state を共有するパターン
オブジェクトの共有ができる (使い回せる)
メモリ管理が大変
request
multi process
リクエスト単位の mruby コンパイルが必要
リクエスト毎にスクリプトを替えられる
遅い
メモリリーク
mrb_state と bytecode の共有
高パフォーマンス
オブジェクト再利用可能
スクリプトを変えられない
スレッド単位で mrb_state を複数管理
non-block middleware
Fiile I/O, Network I/O, sleep...
通知を待つ間は別の処理をシングルプロセスで実現したい
ミドルウェアは non-block なのに mruby のせいで block されてしまう
リクエストが待たされてしまうとか
mruby 内で一旦 return してる?
マルチプロセス、マルチスレッド、ノンブロッキング環境でどうやるか